/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package epul.bdav;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.LocatorImpl;

/**
 *
 * @author P0801698
 */
public class LivreImportHandler extends org.xml.sax.helpers.DefaultHandler {

    LivreDAO dao;
    LocatorImpl locator;
    ArrayList<String> balises = new ArrayList<String>();
    Stack<Integer> parties = new Stack<Integer>();
    Map<Integer, Integer> idLivres = new HashMap<Integer, Integer>();
    Map<Integer, Integer> idMembres = new HashMap<Integer, Integer>();
    Map<Integer, Integer> idParties = new HashMap<Integer, Integer>();

    LivreImportHandler(LivreDAO dao) {
        this.dao = dao;
        // On definit le locator par defaut.
        locator = new LocatorImpl();
    }

    /**
     * Evenement envoye au demarrage du parse du flux xml.
     * @throws SAXException en cas de probleme quelquonque ne permettant pas de
     * se lancer dans l'analyse du document.
     * @see org.xml.sax.ContentHandler#startDocument()
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("Debut de l'analyse du document");
    }

    /**
     * Evenement envoye a la fin de l'analyse du flux xml.
     * @throws SAXException en cas de probleme quelquonque ne permettant pas de
     * considerer l'analyse du document comme etant complete.
     * @see org.xml.sax.ContentHandler#endDocument()
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("Fin de l'analyse du document");
    }

    /**
     * Debut de traitement dans un espace de nommage.
     * @param prefixe utilise pour cet espace de nommage dans cette partie de l'arborescence.
     * @param URI de l'espace de nommage.
     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
     */
    @Override
    public void startPrefixMapping(String prefix, String URI) throws SAXException {
        System.out.println("Traitement de l'espace de nommage : " + URI + ", prefixe choisi : " + prefix);
    }

    /**
     * Fin de traitement de l'espace de nommage.
     * @param prefixe le prefixe choisi a l'ouverture du traitement de l'espace nommage.
     * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
     */
    public void endPrefixMapping(String prefix) throws SAXException {
        System.out.println("Fin de traitement de l'espace de nommage : " + prefix);
    }

    /**
     * Evenement recu a chaque fois que l'analyseur rencontre une balise xml ouvrante.
     * @param nameSpaceURI l'url de l'espace de nommage.
     * @param localName le nom local de la balise.
     * @param rawName nom de la balise en version 1.0 <code>nameSpaceURI + ":" + localName</code>
     * @throws SAXException si la balise ne correspond pas a ce qui est attendu,
     * comme par exemple non respect d'une dtd.
     * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
     */
    @Override
    public void startElement(String nameSpaceURI, String localName, String rawName, Attributes attributs) throws SAXException {
        System.out.println("Ouverture de la balise : " + localName);
        this.balises.add(localName);
        if (!"".equals(nameSpaceURI)) { // espace de nommage particulier
            System.out.println("  appartenant a l'espace de nom : " + nameSpaceURI);
        }

        System.out.println("  Attributs de la balise : ");

        for (int index = 0; index < attributs.getLength(); index++) { // on parcourt la liste des attributs
            System.out.println("     - " + attributs.getLocalName(index) + " = " + attributs.getValue(index));
        }
        if (localName.equals("livre")) {

            dao.setIdLivre(Integer.parseInt(attributs.getValue(0)));
            dao.setMembre(Integer.parseInt(attributs.getValue(1)));
            if (!idMembres.containsKey(Integer.parseInt(attributs.getValue(1)))) {
                try {
                    dao.ajout_membre("", "");
                    this.idMembres.put(Integer.parseInt(attributs.getValue(1)), dao.getIdMembre());
                } catch (SQLException ex) {
                    Logger.getLogger(LivreImportHandler.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } else if (localName.equals("auteur")) {
            if(dao.getMembre()==-1)
                dao.setMembre(Integer.parseInt(attributs.getValue(0)));
            if (!idMembres.containsKey(Integer.parseInt(attributs.getValue(0)))) {
                try {
                    dao.ajout_membre("", "");
                    this.idMembres.put(Integer.parseInt(attributs.getValue(0)), dao.getIdMembre());
                } catch (SQLException ex) {
                    Logger.getLogger(LivreImportHandler.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } else if (localName.equals("partie")) {
            parties.push(Integer.parseInt(attributs.getValue(0)));
        } else if (localName.equals("membre")) {
            dao.setMembre(Integer.parseInt(attributs.getValue(0)));
            if (!idMembres.containsKey(Integer.parseInt(attributs.getValue(0)))) {
                try {
                    dao.ajout_membre("", "");
                    this.idMembres.put(Integer.parseInt(attributs.getValue(0)), dao.getIdMembre());
                } catch (SQLException ex) {
                    Logger.getLogger(LivreImportHandler.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    /**
     * Evenement recu a chaque fermeture de balise.
     * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
     */
    public void endElement(String nameSpaceURI, String localName, String rawName) throws SAXException {
        System.out.print("Fermeture de la balise : " + localName);
        this.balises.remove(localName);
        if(localName.equals("partie"))
             parties.pop();
        if (!"".equals(nameSpaceURI)) { // name space non null
            System.out.print("appartenant a l'espace de nommage : " + localName);
        }
        System.out.println();
    }

    /**
     * Evenement recu a chaque fois que l'analyseur rencontre des caracteres (entre
     * deux balises).
     * @param ch les caracteres proprement dits.
     * @param start le rang du premier caractere a traiter effectivement.
     * @param end le rang du dernier caractere a traiter effectivement
     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
     */
    public void characters(char[] ch, int start, int end) throws SAXException {
        System.out.println("#PCDATA : " + new String(ch, start, end));
        if (this.balises.get(balises.size() - 1).equals("titre")
                && this.balises.get(balises.size() - 2).equals("livre")) {
            try {
                dao.setTitreLivre(new String(ch, start, end));
                dao.ajout_livre(dao.getMembre(), dao.getTitreLivre());
                this.idLivres.put(dao.getIdLivre(), dao.getIdLivre(dao.getTitreLivre()));
            } catch (SQLException ex) {
                Logger.getLogger(LivreImportHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (this.balises.get(balises.size() - 1).equals("titre")
                && this.balises.get(balises.size() - 2).equals("partie")) {
            dao.setTitrePartie(new String(ch, start, end));
        } else if (this.balises.get(balises.size() - 1).equals("contenu")) {
                dao.setContenu(new String(ch, start, end));
                  try {
                int idPartie = -1;
                System.out.println("********"+parties.size());
                if (parties.size() > 1) {
                    idPartie = parties.get(this.parties.size() - 2);
                    idPartie = idParties.get(idPartie);
                }
                dao.ajoute_partie(dao.getIdLivre(), idPartie, dao.getTitrePartie(), dao.getContenu(), dao.getMembre());
                dao.setTitrePartie("");
                dao.setMembre(-1);
                this.idParties.put(this.parties.lastElement(), dao.getIdPartie());
            } catch (SQLException ex) {
                Logger.getLogger(LivreImportHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (this.balises.get(balises.size() - 1).equals("nom")) {
            dao.setNomMembre(new String(ch, start, end));
        } else if (this.balises.get(balises.size() - 1).equals("email")) {
            try {
                dao.setEmailMembre(new String(ch, start, end));
                dao.modifier_membre(this.idMembres.get(dao.getMembre()), dao.getNomMembre(), dao.getEmailMembre());
            } catch (SQLException ex) {
                Logger.getLogger(LivreImportHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * Recu chaque fois que des caracteres d'espacement peuvent etre ignores au sens de
     * XML. C'est a dire que cet evenement est envoye pour plusieurs espaces se succedant,
     * les tabulations, et les retours chariot se succedants ainsi que toute combinaison de ces
     * trois types d'occurrence.
     * @param ch les caracteres proprement dits.
     * @param start le rang du premier caractere a traiter effectivement.
     * @param end le rang du dernier caractere a traiter effectivement
     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
     */
    public void ignorableWhitespace(char[] ch, int start, int end) throws SAXException {
        System.out.println("espaces inutiles rencontres : ..." + new String(ch, start, end) + "...");
    }

    /**
     * Rencontre une instruction de fonctionnement.
     * @param target la cible de l'instruction de fonctionnement.
     * @param data les valeurs associees a cette cible. En general, elle se presente sous la forme
     * d'une serie de paires nom/valeur.
     * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
     */
    public void processingInstruction(String target, String data) throws SAXException {
        System.out.println("Instruction de fonctionnement : " + target);
        System.out.println("  dont les arguments sont : " + data);
    }

    /**
     * Recu a chaque fois qu'une balise est evitee dans le traitement a cause d'un
     * probleme non bloque par le parser. Pour ma part je ne pense pas que vous
     * en ayez besoin dans vos traitements.
     * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
     */
    public void skippedEntity(String arg0) throws SAXException {
        // Je ne fais rien, ce qui se passe n'est pas franchement normal.
        // Pour eviter cet evenement, le mieux est quand meme de specifier une dtd pour vos
        // documents xml et de les faire valider par votre parser.
    }
}
